package com.chs.recoginition.core.utils;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

/**
 * 上传文件工具类
 */
@Slf4j
public class UploadUtil {

	private static final String win_data_root = "F:/Project/recoginition/recoginition/target";

	private static final String linux_data_root = "/home/recoginition";

	private static final String mac_data_root = "/home/mesdata";

	private static final String allowPictureType = "jpg,png";

	private static final String allowFileType = "xls,doc,xlsx,docx,apk";

	public static final String localhost = "http://192.168.185.122:18081";
	/**
	 * 上传图片存放的目录
	 */
	public static final String UPLOAD_PICTURE_PATH = "images/";
	/**
	 * 允许上传的图片类型
	 */
	public static List<String> allowPictureTypeList = new ArrayList<>(Arrays.asList(allowPictureType.split(",")));

	/**
	 * 上传文件存放的目录
	 */
	public static final String UPLOAD_FILE_PATH = "resouce/uploadFile/";

	/**
	 * 允许上传的文件类型
	 */
	public static List<String> allowFileTypeList = new ArrayList<>(Arrays.asList(allowFileType.split(",")));

	/**
	 * 验证上传的图片是否合法，将图片存放到指定目录
	 * 
	 * @param picture 上传的图片
	 * @param newFileName 重命名后的文件名（不带后缀名）
	 * @param directory 存放图片的目录名（前后都不用带/）
	 * @return 图片的相对路径，可将此值存入数据库，返回null时上传失败
	 * @throws IOException
	 * @throws IllegalStateException
	 */
	public static String uploadPicture(MultipartFile picture, String newFileName, String directory) throws IllegalStateException, IOException {
		return uploadFile(UPLOAD_PICTURE_PATH, allowPictureTypeList, picture, newFileName, directory, false);
	}

	
	/**
	 * 验证上传的图片是否合法，并且压缩图片大小存放到指定目录
	 * 
	 * @param picture 上传的图片
	 * @param newFileName 重命名后的文件名（不带后缀名）
	 * @param directory 存放图片的目录名（前后都不用带/）
	 * @return 图片的相对路径，可将此值存入数据库，返回null时上传失败
	 * @throws IOException
	 * @throws IllegalStateException
	 */
	public static String uploadAndCompressPicture(MultipartFile picture, String newFileName, String directory) throws IllegalStateException, IOException {
		return uploadFile(UPLOAD_PICTURE_PATH, allowPictureTypeList, picture, newFileName, directory, true);
	}
	
	
	/**
	 * 验证上传的文件是否合法，将文件存放到指定目录
	 * 
	 * @param file 上传的文件
	 * @param newFileName 重命名后的文件名（不带后缀名）
	 * @param directory 存放文件的目录名（前后都不用带/）
	 * @return 文件的相对路径，可将此值存入数据库，返回null时上传失败
	 * @throws IOException
	 * @throws IllegalStateException
	 */
	public static String uploadFile(MultipartFile file, String newFileName, String directory) throws IllegalStateException, IOException {
		return uploadFile(UPLOAD_FILE_PATH, allowFileTypeList, file, newFileName, directory, false);
	}

	/**
	 * 验证上传的文件是否合法，将文件存放到指定目录
	 * 
	 * @param file 上传的文件
	 * @param newFileName 重命名后的文件名（不带后缀名）
	 * @param directory 存放文件的目录名（前后都不用带/）
	 * @param ifCompress 是否压缩图片大小
	 * @return 文件的相对路径，可将此值存入数据库，返回null时上传失败
	 * @throws IOException
	 * @throws IllegalStateException
	 */
	private static String uploadFile(String savePath, List<String> allowType, MultipartFile file, String newFileName, String directory, boolean ifCompress)
			throws IllegalStateException, IOException {
		if (file == null) {
			return null;
		}

		String oriFileName = file.getOriginalFilename(); // 文件原名称
		log.info("上传文件--原文件名-->" + oriFileName);
		if (!oriFileName.contains(".")) { // 没有后缀名，不能上传
			return null;
		}
		String fileType = oriFileName.substring(oriFileName.lastIndexOf(".") + 1).toLowerCase(); // 文件类型

		if (!allowType.contains(fileType)) {
			return null;
		}

		// 项目在容器中实际发布运行的根路径
		// String rootPath = request.getSession().getServletContext().getRealPath("/");
		String rootPath = getRootPath();
		String dirPath = rootPath + savePath + directory;
		File dir = new File(dirPath);
		if (!dir.exists()) {
			dir.mkdirs();
		}
		String path = dirPath + "/" + newFileName + LocalDateTimeUtils.format(new Date(), "yyyyMMddHHmmss") + "." + fileType;
		// 转存文件到指定的路径
		file.transferTo(new File(path));
		log.info("上传文件--保存路径-->" + path);
		if(ifCompress) {
//			String compressPath = ImageUtil.compressImageUtil25(path);
//			log.info("上传文件--压缩后图片后路径-->" + compressPath);
//			return compressPath.substring(compressPath.indexOf(rootPath) + rootPath.length());
		}
 		
		

		return path.substring(path.indexOf(rootPath) + rootPath.length());
	}

	public static void main(String[] args) throws IOException, InterruptedException {
	}

	public static String getRootPath() {

		String rootPath = "";

		if (BaseUtil.isWindows()) {
			rootPath = win_data_root;
		}
		if (BaseUtil.isMac()) {
			rootPath = mac_data_root;
		}
		if (BaseUtil.isLinux()) {
			rootPath = linux_data_root;
		}
		rootPath += "/";

		return rootPath;
	}

}
